#include<iostream>
#include<vector>
#include<math.h>
#include<string.h>
using namespace std;
int n, tmp, sum{1}, half{0};
vector<int> v;
int* p = new int[100];
bool isPrime(int n);
int match(int n);


int main()
{
    cin >> n;
    while(n--)
    {
        cin >> tmp;
        sum *= tmp;
    }
    half = sum / 2;
    // cout << sum << endl;
    for(int i = 2; i < half; i++)
    {
        if(isPrime(i) && ((sum % i) == 0))
        {
            // cout << i << endl;
            v.push_back(i);
        }
    }
    memset(p, 0, sizeof(p));  // 动态分配的内存需要对其进行初始化
    match(1);  // 涉及变量级别的嵌套循环时，尝试用递归去求解
    // for(int i = 0; i < v.size(); i++)
    // {
    //     cout << p[i] << endl;
    // }
    int sums = 0;
    int sumz = 1;
    for(int i = 0; i < v.size(); i++)
    {
        sums = 0;
        for(int j = 0; j <= p[i]; j++)
        {
            // cout << pow(v[i], p[i]); 
            sums += pow(v[i], j); 
        }
        sumz *= sums;
    }
    cout << sumz << endl;
    return 0;
}


bool isPrime(int n)
{
    int m = 0;
    if (n == 2) return true;
    m = n / 2;
    for (int i = 2; i <= m; i++)
    {
        if((n % i) == 0) return false;
    }
    return true;
}


int match(int n)
{
    if(n == sum) return 1;
    if(n > sum) return 0;
    for(int i = 0; i < v.size(); i++)
    {
        p[i]++;
        //cout << n * v[i] << endl;
        if(match(n * v[i]))
        {
            break;
        }
        p[i]--;  // attention to release
    }
}